package com.water.quality.testing.utils;


import com.water.quality.testing.dao.ObservationPoint;
import com.water.quality.testing.dao.WaterData;
import com.water.quality.testing.mapper.ObservationPointMapper;
import com.water.quality.testing.service.ObservationPointService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;

import java.util.Random;

/**
 * 数据模拟生成工具类
 */
@Component
@RequiredArgsConstructor
public class WaterDataGenerator {
    private final ObservationPointMapper observationPointMapper;
    // 随机数生成器，用于生成随机的水质数据
    private final Random random = new Random();

    /**
     * 生成新的水质数据
     *
     * @param observationPointId 观测点ID
     * @param lastData 上一次生成的数据，可以为null
     * @return 生成的水质数据
     */
    public WaterData generateNewData(Long observationPointId, WaterData lastData) {
        // 从数据库中查询指定的观测点信息
        ObservationPoint observationPoint = observationPointMapper.selectById(observationPointId);
        // 根据上一次的数据生成新的数据，如果上一次的数据为空，则使用默认值
        double clarity = generateRandomValue(lastData != null ? lastData.getClarity() : 5.0, 1.0, 0.0, 10.0);
        double pH = generateRandomValue(lastData != null ? lastData.getpH() : 7.0, 0.5, 0.0, 14.0);
        double particleSize = generateRandomValue(lastData != null ? lastData.getParticleSize() : 150.0, 10.0, 0.0, 300.0);
        double conductivity = generateRandomValue(lastData != null ? lastData.getConductivity() : 1000.0, 100.0, 0.0, 2000.0);
        double temperature = generateRandomValue(lastData != null ? lastData.getTemperature() : 20.0, 2.0, 0.0, 35.0);
        double bacteria = generateRandomValue(lastData != null ? lastData.getBacteria() : 500.0, 50.0, 0.0, 1000.0);
        double fluoride = generateRandomValue(lastData != null ? lastData.getFluoride() : 1.0, 0.1, 0.0, 3.0);
        // 返回新的水质数据对象，包含观测点名称
        return new WaterData(clarity, pH, particleSize, conductivity, temperature, bacteria, fluoride, observationPointId, observationPoint.getName());
    }

    /**
     * 生成随机值的方法
     *
     * @param currentValue 当前值
     * @param maxChange 最大变化范围
     * @param minValue 最小值
     * @param maxValue 最大值
     * @return 生成的随机值
     */
    private double generateRandomValue(double currentValue, double maxChange, double minValue, double maxValue) {
        // 随机决定是增加还是减少
        boolean increase = random.nextBoolean();
        // 生成一个随机的变化量
        double change = random.nextDouble() * maxChange;
        if (increase) {
            currentValue += change;
        } else {
            currentValue -= change;
        }

        // 确保值在合理范围内
        if (currentValue < minValue) {
            currentValue = minValue;
        } else if (currentValue > maxValue) {
            currentValue = maxValue;
        }

        return currentValue;
    }
}

